﻿#region License Information
// Copyright (c) 2005 - 2009, Allan Spartacus Mangune (allan@owlpal.com)
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without modification, 
// are permitted provided that the following conditions are met:
//
// * Redistributions of source code must retain the above copyright notice, this list 
//   of conditions and the following disclaimer.
//
// * Redistributions in binary form must reproduce the above copyright notice, this list of 
//   conditions and the following disclaimer in the documentation and/or other materials provided 
//   with the distribution.
//
// * Neither the name of Owlpal nor the names of its contributors may be used to endorse or 
//   promote products derived from this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS 
// OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND 
// FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 
// BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, 
// OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE 
// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
#endregion

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Owlpal.Models;

namespace Owlpal.Models.Repositories
{
    public class EntryRepository : Repository<Owlpal.Models.Entry>, IEntryRepository
    {
        public EntryRepository()
            : base(new Owlpal.Models.Repositories.Factories.DataContextFactory())
        {

        }

        public AddEntryStatus SaveEntry(Owlpal.Models.Entry entry)
        {
            AddEntryStatus status = AddEntryStatus.UnknownError;
            Entry entryEntity = new Entry();
            entryEntity.ID = entry.ID;
            entryEntity.AllowComment = entry.IsCommentingAllowed;
            entryEntity.AllowPing = entry.IsPingingAllowed;
            entryEntity.AllowTrackback = entry.IsTrackbackAllowed;
            Blog blogEntity = dataContextFactory.Context.Blog.FirstOrDefault(b => b.ID == entry.Blog.ID);
            entryEntity.BlogReference.Value = blogEntity;
            entryEntity.CommentStatus = entry.CommentStatus;
            entryEntity.DateCreated = entry.CreationDate;
            entryEntity.DateUpdated = entry.DateUpdated;
            entryEntity.EnableCommentNotification = entry.IsCommentNotificationEnabled;
            entryEntity.EnableExcerptSyndication = entry.IsExcerptSyndicationEnabled;
            entryEntity.Excerpt = entry.Excerpt;
            entryEntity.FlightEndDate = entry.FlightEndDate;
            entryEntity.FlightStartDate = entry.FlightStartDate;
            entryEntity.LinkName = entry.LinkName;
            entryEntity.Status = entry.Status;
            entryEntity.SyndicationDate = entry.SyndicationDate;
            entryEntity.Text = entry.Text;
            entryEntity.Title = entry.Title;
            dataContextFactory.Context.AddToEntry(entryEntity);
            try
            {
                dataContextFactory.Context.SaveChanges();
                status = AddEntryStatus.Added;
            }
            catch (Exception ex)
            {
                status = AddEntryStatus.Failed;
            }
            return status;
        }

        public List<Models.Entry> FindEntries()
        {
            List<Models.Entry> entries = new List<Owlpal.Models.Entry>();
            var query = from e in dataContextFactory.Context.Entry
                        orderby e.FlightStartDate descending
                        select new
                        {
                            e.ID,
                            e.Title,
                            e.Text,
                            e.FlightStartDate,
                            e.EntryTag,
                            e.AllowPing,
                            e.AllowComment,
                            CommentCount = e.Comment.Count
                        };
            foreach (var entryEntity in query)
            {
                Models.Entry entry = new Owlpal.Models.Entry();
                entries.Add(new Models.Entry{ ID = entryEntity.ID,
                                              Title = entryEntity.Title,
                                              Text = entryEntity.Text,
                                              IsPingingAllowed = entryEntity.AllowComment,
                                              IsCommentingAllowed = entryEntity.AllowComment,
                                              CommentCount = entryEntity.CommentCount
                                            });
            }
            return entries;
        }

        public List<Models.Entry> FindEntries(int pageIndex, int pageSize, out int count)
        {
            List<Models.Entry> entries = new List<Owlpal.Models.Entry>();
            var query = from e in dataContextFactory.Context.Entry
                        orderby e.FlightStartDate descending
                        select new
                        {
                            e.ID,
                            e.Title,
                            e.Text,
                            e.FlightStartDate,
                            e.EntryTag,
                            e.AllowPing,
                            e.AllowComment,
                            CommentCount = e.Comment.Count
                        };
            int skip = Math.Max(pageSize * (pageIndex - 1), 0);
            foreach (var entryEntity in query.Skip(skip).Take(pageSize))
            {
                Models.Entry entry = new Owlpal.Models.Entry();
                entries.Add(new Models.Entry
                {
                    ID = entryEntity.ID,
                    Title = entryEntity.Title,
                    Text = entryEntity.Text,
                    IsPingingAllowed = entryEntity.AllowComment,
                    IsCommentingAllowed = entryEntity.AllowComment,
                    CommentCount = entryEntity.CommentCount
                });
            }
            count = query.Count();
            return entries;
        }
    }
}
